/**
 * 支付产品字典 - 数据转换工具
 *
 * 这个文件提供数据转换层，将后端数据适配为前端UI组件所需格式
 */

import type {
  PayProductDict,
  ProductType,
  SceneType,
  ProductStatus
} from './types';
import {
  PRODUCT_TYPE_CONFIG,
  SCENE_TYPE_CONFIG
} from './types';

// ==================== UI层类型定义 ====================

/**
 * UI层产品卡片数据（简化版，类似渠道卡片）
 */
export interface UIProductCard {
  id: number;
  key: number; // 兼容性别名
  productName: string;
  name: string; // 兼容性别名
  englishName: string;
  productIcon: string;
  logoUrl: string; // 兼容性别名
  productDesc: string;
  statusText: string;
  status: 'enabled' | 'disabled';
  statusColor: string;
  gradientBg: string;
  iconGradient: string;
  rateDesc: string;
  sceneTypeName: string;
}

/**
 * UI层产品分类配置（仅用于固定数据模式）
 */
export interface UIProductConfig {
  type: number;
  name: string;
  englishName: string;
  logo: string;
  gradient: string;
  iconGradient: string;
  cardClass: string;
  products: UIProductCard[];
  totalCount: number;
  enabledCount: number;
}



// ==================== 核心转换函数 ====================

/**
 * 生成渐变背景配置
 */
function generateGradientConfig(color: string): { gradientBg: string; iconGradient: string } {
  // 将hex颜色转换为rgb
  const hexToRgb = (hex: string) => {
    const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
    return result ? {
      r: parseInt(result[1], 16),
      g: parseInt(result[2], 16),
      b: parseInt(result[3], 16)
    } : { r: 107, g: 114, b: 128 }; // 默认灰色
  };

  const rgb = hexToRgb(color);
  return {
    gradientBg: `linear-gradient(135deg, rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.05) 0%, rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.1) 100%)`,
    iconGradient: `linear-gradient(135deg, ${color}, ${color}dd)`
  };
}

/**
 * 🎯 核心函数：将产品数据直接转换为UI卡片数据
 * @param products 原始产品数据数组
 * @returns UI产品卡片数组，不分类
 */
export function transformProductDataToCards(products: PayProductDict[]): UIProductCard[] {
  return products.map((product, index) => {
    const extraInfo = product.extraInfo || {};
    const status = extraInfo.status === 1 ? 'enabled' : 'disabled' as const;
    const statusText = extraInfo.status === 1 ? '启用' : '禁用';
    const statusColor = status === 'enabled' ? 'green' : 'red';
    const sceneTypeName = isValidSceneType(extraInfo.sceneType)
      ? SCENE_TYPE_CONFIG[extraInfo.sceneType]?.name || '未知场景'
      : '未知场景';
    const rateDesc = extraInfo.standardRate === 0 ? '免费' : `${(extraInfo.standardRate * 100).toFixed(2)}%`;
    const productIcon = product.productIcon || 'https://tianyuankejioss.oss-cn-shanghai.aliyuncs.com/icon/其他.svg';
    const productDesc = product.productDesc || `${sceneTypeName}解决方案，安全便捷的支付体验`;
    const productTypeColor = isValidProductType(extraInfo.productType)
      ? getProductTypeColor(extraInfo.productType)
      : '#6b7280';
    const gradientConfig = generateGradientConfig(productTypeColor);

    return {
      id: index + 1,
      key: index + 1,
      productName: product.productName,
      name: product.productName,
      englishName: product.productCode,
      productIcon,
      logoUrl: productIcon,
      productDesc,
      statusText,
      status,
      statusColor,
      rateDesc,
      sceneTypeName,
      ...gradientConfig
    };
  });
}

/**
 * 将产品数据转换为分类展示（固定数据模式）
 * @param products 原始产品数据数组
 * @returns UI产品配置数组，按类型分组
 */
export function transformProductDataToGroupedCards(products: PayProductDict[]): UIProductConfig[] {
  // 按产品类型分组
  const groupedProducts = products.reduce((acc, product) => {
    const type = product.extraInfo?.productType || 5; // 默认为其他类型
    if (!acc[type]) {
      acc[type] = [];
    }
    acc[type].push(product);
    return acc;
  }, {} as Record<number, PayProductDict[]>);

  // 转换为UI配置格式
  const result: UIProductConfig[] = [];

  for (const [type, productList] of Object.entries(groupedProducts)) {
    const typeNum = parseInt(type);
    const config = PRODUCT_TYPE_CONFIG[typeNum as ProductType];

    if (!config) {
      console.warn(`Unknown product type: ${typeNum}`);
      continue;
    }

    // 转换产品列表为卡片数据
    const productCards = transformProductDataToCards(productList);

    // 计算统计信息
    const totalCount = productList.length;
    const enabledCount = productList.filter(p => p.extraInfo?.status === 1).length;

    // 生成cardClass
    const cardClassMap: Record<ProductType, string> = {
      1: 'wechat-card',
      2: 'alipay-card',
      3: 'unionpay-card',
      4: 'dcep-card',
      5: 'other-card'
    };
    const cardClass = cardClassMap[typeNum as ProductType] || 'other-card';

    result.push({
      type: typeNum,
      name: config.name,
      englishName: config.englishName,
      logo: config.logo,
      gradient: config.gradient,
      iconGradient: config.iconGradient,
      cardClass,
      products: productCards.sort((a, b) => {
        // 按状态排序，然后按ID排序
        if (a.status !== b.status) {
          return a.status === 'enabled' ? -1 : 1;
        }
        return a.key - b.key;
      }),
      totalCount,
      enabledCount
    });
  }

  return result.sort((a, b) => a.type - b.type);
}

// ==================== 工具函数 ====================

/**
 * 判断产品类型是否有效
 */
export function isValidProductType(productType: number): productType is ProductType {
  return productType >= 1 && productType <= 5;
}

/**
 * 判断场景类型是否有效
 */
export function isValidSceneType(sceneType: number): sceneType is SceneType {
  return sceneType >= 1 && sceneType <= 6;
}

/**
 * 获取产品类型颜色
 */
export function getProductTypeColor(productType: ProductType): string {
  return PRODUCT_TYPE_CONFIG[productType]?.color || '#6b7280';
}

/**
 * 获取场景类型颜色
 */
export function getSceneTypeColor(sceneType: SceneType): string {
  return SCENE_TYPE_CONFIG[sceneType]?.color || '#6b7280';
}

/**
 * 获取状态颜色
 */
export function getStatusColor(status: ProductStatus): string {
  return status === 1 ? '#52c41a' : '#ff4d4f';
}

/**
 * 获取产品场景颜色
 */
export function getProductSceneColor(productScene: string): string {
  const sceneColorMap: Record<string, string> = {
    'APP': '#52c41a',        // 绿色 - APP支付
    'H5': '#1890ff',         // 蓝色 - H5支付
    'JSAPI': '#722ed1',      // 紫色 - JSAPI支付
    'NATIVE': '#fa8c16',     // 橙色 - 扫码支付
    'MINIPROGRAM': '#13c2c2', // 青色 - 小程序支付
    'FACEPAY': '#f759ab',    // 粉色 - 刷脸支付
    'CARD': '#eb2f96'        // 玫红色 - 刷卡支付
  };
  return sceneColorMap[productScene] || '#6b7280';
}
